package it.infodea.tapestrydea.services.jcr;

import it.infodea.tapestrydea.services.jcr.nodes.wrappers.JcrFileNode;
import it.infodea.tapestrydea.services.jcr.nodes.wrappers.JcrFolderNode;

import java.io.InputStream;
import java.util.List;

import javax.jcr.ItemNotFoundException;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
/**
 * Questo servizio permette di effettuare le principali operazioni
 * sui nodi nt:folder e dea:file del repository.
 * La rappresentazione di questi due nodi avviene attraverso due oggetti
 * <code>FileNodeDTO</code> e <code>FolderNodeDTO</code>. Affinché questi
 * funzionino correttamente il node dea:file deve contenere un node nt:resource
 * @author bobpuley
 *
 */
public interface JcrWorkspaceService {
	
	/**
	 * Aggiunge un file al repository nella cartella parentAbsolutePath
	 * con il nome e il contenuto specificati. 
	 * @param parentAbsolutePath il path assoluto della cartella all'interno della 
	 * quale si vuole creare il file (es: /blogs/bobblog/posts/il_caso/attach). 
	 * @param name il nome del file
	 * @param owner il proprietario del file
	 * @param stream lo stream del file di origine
	 * @return restituisce il nodo creato, incapsulato in un oggetto 
	 * <code>FileNodeDTO</code> 
	 * @throws RepositoryException se il file richiesto non può essere creato
	 */
	public JcrFileNode addFile(String parentAbsolutePath, String name, String owner,
			InputStream stream) throws RepositoryException;

	/**
	 * 
	 * @param parentAbsolutePath il path assoluto della cartella all'interno della 
	 * quale si vuole creare il file (es: /blogs/bobblog/posts/il_caso/attach).
	 * @param name il nome della caretlla da creare
	 * @return la caretlla appena creata
	 * @throws RepositoryException se non è possibile creare la cartella
	 */
	public JcrFolderNode addFolder(String parentAbsolutePath, String name) throws RepositoryException;
	
	/**
	 * 
	 * @param parentAbsolutePath il path assoluto della cartella all'interno della 
	 * quale si vuole creare il file (es: /blogs/bobblog/posts/il_caso/attach).
	 * @param relativePath il path relativo (es: images/thumbs) a parentAbsolutePath
	 * @return restituisce la cartella pricipale delle nuove create (qualla che 
	 * contiene le altre) 
	 * @throws RepositoryException se non è possibile creare le cartelle
	 */
	public JcrFolderNode addRecoursiveFolders(String parentAbsolutePath,
			String relativePath) throws RepositoryException;
	
	/**
	 * Carica e restituisce la caretlla root per l'amministatore
	 * ovvero la root del workspace a cui ci si è loggati
	 * @return la root del workspace
	 * @throws RepositoryException in caso di errore durante l'accesso al repository
	 */
	public JcrFolderNode getAdminRootNode() throws RepositoryException;
	
	/**
	 * Carica e restituisce una lista i folders, figlie della caretlla
	 * corrispondente al parentAbsolutePath.
	 * @param parentAbsolutePath parentAbsolutePath il path assoluto della cartella della quale
	 * si vogliono caricare i figli (es: /blogs/bobblog/posts/il_caso/attach).
	 * @return una <code>List</code> di <code>FolderNodeDTO</code> o una lista vuota 
	 * @throws RepositoryException in caso di errore durante l'accesso al repository
	 */
	public List<JcrFolderNode> getChildFolders(String parentAbsolutePath)  throws RepositoryException;

	/**
	 * Carica e restituisce la caretlla root per l'utente
	 * corrente
	 * @return la caretlla root per l'utente corrente
	 * @throws RepositoryException in caso di errore durante l'accesso al repository
	 */
	public JcrFolderNode getUserRootNode()  throws RepositoryException;
	
	/**
	 * Carica e restituisce la caretlla root per l'utente
	 * corrente
	 * @return la caretlla root per l'utente corrente
	 * @throws RepositoryException in caso di errore durante l'accesso al repository
	 */
	public JcrFolderNode getVirtualRootNode(String rootPath)  throws RepositoryException;
	
	/**
	 * Restituisce un folder specifico
	 * @param absolutePath il path assoluto della cartella da caricare 
	 * (es: /blogs/bobblog/posts/il_caso/attach).
	 * @return la cartella desiderata o null
	 * @throws PathNotFoundException se la cartella non esiste 
	 * @throws RepositoryException in caso di errore durante l'accesso al repository
	 */
	public JcrFolderNode getFolder(String absolutePath) throws PathNotFoundException, RepositoryException;
	
	/**
	 * Resituisce il file richiesto 
	 * @param absolutePath il path assoluto della file da caricare
	 * (es: /blogs/bobblog/posts/il_caso/attach/allegato1.pdf)
	 * @return il file richiesto o null;
	 * @throws PathNotFoundException se il file non esiste 
	 * @throws RepositoryException in caso di errore durante l'accesso al repository
	 */
	public JcrFileNode getFile(String absolutePath) throws PathNotFoundException, RepositoryException;
	
	/**
	 * Restituisce una cartella in base al suo identificativo
	 * @param uuid lo UUID della caretlla richiesta
	 * @return la cartella corrispondente all'UUID passato o null
	 * @throws ItemNotFoundException se il nodo non è reperibile
	 * @throws RepositoryException in caso di errore durante l'accesso al repository
	 */
	public JcrFolderNode getFolderByUUID(String uuid) throws ItemNotFoundException, RepositoryException;
	
	/**
	 * Restituisce un file in base al suo identificativo
	 * @param uuid lo UUID del file richiesta
	 * @return il file corrispondente all'UUID passato o null
	 * @throws ItemNotFoundException se il nodo non è reperibile
	 * @throws RepositoryException in caso di errore durante l'accesso al repository
	 */
	public JcrFileNode getFileByUUID(String uuid) throws ItemNotFoundException, RepositoryException;
	
	/**
	 * Rimuove un nodo dal repository in base al absolutePath
	 * @param absolutePath il path assoluto del nodo da rimuovere
	 * (es: /blogs/bobblog/posts/il_caso/attach  oppure
	 * /blogs/bobblog/posts/il_caso/attach/allegato1.pdf)
	 * @throws RepositoryException in caso di errore durante l'accesso al repository
	 */
	public void removeNode(String absolutePath) throws RepositoryException;
}
